package com.sscl.baselibrary.activity

import android.os.Bundle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.viewbinding.ViewBinding
import com.sscl.baselibrary.exts.getParameterizedType

/**
 * 文件介绍： Activity ViewBinding MVVM基类
 *
 *  @author Jackie Penghe
 *  时间： 2024/07/15 18
 */
abstract class BaseMvvmForViewBindingWithTitleActivity<VB : ViewBinding, VM : ViewModel> :
    BaseViewBindingWithTitleAppCompatActivity<VB>() {

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 属性声明
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    /* * * * * * * * * * * * * * * * * * * 子类可用属性 * * * * * * * * * * * * * * * * * * */

    protected lateinit var mViewModel: VM

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 重写方法
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    override fun onCreate(savedInstanceState: Bundle?) {
        initViewModel()
        super.onCreate(savedInstanceState)
    }

    override fun initViewData(savedInstanceState: Bundle?) {
        initView(savedInstanceState)
        initViewModelObserve()

    }

    /**
     * 初始化View数据
     */
    abstract fun initView(savedInstanceState: Bundle?)

    /**
     * 初始化ViewModel观察者
     */
    abstract fun initViewModelObserve()

    /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
     *
     * 私有方法
     *
     * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

    private fun initViewModel() {
        val parameterizedType = getParameterizedType()
        val argument = parameterizedType.actualTypeArguments
        @Suppress("UNCHECKED_CAST")
        mViewModel = ViewModelProvider(this)[argument[1] as Class<VM>]
    }
}